-- 基于计数器算法实现的限流


-- 获取限流的Key
local methodKey = KEYS[1]
redis.log(redis.LOG_DEBUG, 'key is', methodKey)
-- 获取限流的大小
local limit = tonumber(ARGV[1])
redis.log(redis.LOG_DEBUG, 'limit is', limit)
local outtime = tonumber(ARGV[2])
redis.log(redis.LOG_DEBUG, 'outtime is', outtime)
-- 获取当前流量大小
local count = tonumber(redis.call('get', methodKey) or "0")

-- 判断是否超出限流阈值
if count + 1 > limit then
    -- -1，拒绝服务访问
    return -1
else
    -- 没有超过阈值
    -- 设置当前访问的数量+1
    local num = tonumber(redis.call("INCRBY", methodKey, 1))
    -- 设置过期时间
    redis.call("EXPIRE", methodKey, outtime)
    -- 放行
    return num
end